#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
供应链数据分析系统命令行工具
提供简单的命令行接口，用于快速启动分析系统
"""

import argparse
import logging
import os
import sys
from datetime import datetime

from src.main import SupplyChainAnalysisSystem

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def setup_parser():
    """
    设置命令行参数解析器
    
    返回:
        解析器对象
    """
    parser = argparse.ArgumentParser(
        description='供应链数据分析系统命令行工具',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  # 生成示例数据
  python analyze.py generate --orders 1000 --seed 42
  
  # 加载数据并分析库存
  python analyze.py inventory
  
  # 加载数据并分析订单
  python analyze.py orders
  
  # 生成综合数据看板
  python analyze.py dashboard
  
  # 运行完整分析流程
  python analyze.py full"""
    )
    
    # 添加子命令
    subparsers = parser.add_subparsers(dest='command', help='子命令', metavar='{generate|load|inventory|orders|dashboard|full}')
    
    # 生成数据命令
    generate_parser = subparsers.add_parser('generate', help='生成示例数据')
    generate_parser.add_argument('--orders', type=int, default=1000, help='生成的订单数量')
    generate_parser.add_argument('--seed', type=int, default=42, help='随机种子')
    generate_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    generate_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    
    # 加载数据命令
    load_parser = subparsers.add_parser('load', help='加载数据')
    load_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    load_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    
    # 分析库存命令
    inventory_parser = subparsers.add_parser('inventory', help='分析库存')
    inventory_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    inventory_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    
    # 分析订单命令
    order_parser = subparsers.add_parser('orders', help='分析订单')
    order_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    order_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    
    # 生成看板命令
    dashboard_parser = subparsers.add_parser('dashboard', help='生成数据看板')
    dashboard_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    dashboard_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    dashboard_parser.add_argument('--open', action='store_true', help='生成后自动打开看板')
    
    # 运行完整分析流程命令
    full_parser = subparsers.add_parser('full', help='运行完整分析流程')
    full_parser.add_argument('--data-dir', type=str, default='data', help='数据目录')
    full_parser.add_argument('--output-dir', type=str, default='reports', help='输出目录')
    full_parser.add_argument('--open', action='store_true', help='分析完成后自动打开看板')
    
    # 添加通用参数
    parser.add_argument('--verbose', '-v', action='count', default=0, help='详细输出级别')
    
    return parser

def open_dashboard(dashboard_path):
    """
    打开生成的看板
    
    参数:
        dashboard_path: 看板文件路径
    """
    import webbrowser
    
    if os.path.exists(dashboard_path):
        dashboard_url = f"file://{os.path.abspath(dashboard_path)}"
        logger.info(f"正在打开看板: {dashboard_url}")
        webbrowser.open(dashboard_url)
    else:
        logger.error(f"看板文件不存在: {dashboard_path}")

def main():
    """主函数，处理命令行参数并执行相应操作"""
    # 解析命令行参数
    parser = setup_parser()
    args = parser.parse_args()
    
    # 设置日志级别
    if args.verbose >= 2:
        logging.getLogger().setLevel(logging.DEBUG)
    elif args.verbose >= 1:
        logging.getLogger().setLevel(logging.INFO)
    
    # 打印欢迎信息
    print("\n" + "="*60)
    print(" "*20 + "供应链数据分析系统")
    print(" "*15 + f"版本: 1.0.0  日期: {datetime.now().strftime('%Y-%m-%d')}")
    print("="*60 + "\n")
    
    # 初始化系统
    try:
        system = SupplyChainAnalysisSystem(
            data_dir=args.data_dir if hasattr(args, 'data_dir') else 'data',
            output_dir=args.output_dir if hasattr(args, 'output_dir') else 'reports'
        )
    except Exception as e:
        logger.error(f"系统初始化失败: {e}")
        return 1
    
    dashboard_path = None
    
    try:
        # 执行相应命令
        if args.command == 'generate':
            logger.info(f"正在生成示例数据，订单数量: {args.orders}, 随机种子: {args.seed}")
            system.generate_sample_data(order_count=args.orders, seed=args.seed)
            logger.info("示例数据生成完成")
            
        elif args.command == 'load':
            logger.info("正在加载数据")
            data_dict = system.load_data()
            if data_dict:
                logger.info(f"数据加载完成，共 {len(data_dict)} 个数据表")
                for table_name, df in data_dict.items():
                    logger.info(f"  - {table_name}: {df.shape[0]} 行 x {df.shape[1]} 列")
            
        elif args.command == 'inventory':
            logger.info("正在分析库存")
            system.load_data()
            results = system.analyze_inventory()
            if results:
                logger.info("库存分析完成，结果已保存到输出目录")
                for name, df in results.items():
                    if hasattr(df, 'shape'):
                        logger.info(f"  - {name}: {df.shape[0]} 行 x {df.shape[1]} 列")
            
        elif args.command == 'orders':
            logger.info("正在分析订单")
            system.load_data()
            results = system.analyze_orders()
            if results:
                logger.info("订单分析完成，结果已保存到输出目录")
                for name, df in results.items():
                    if hasattr(df, 'shape'):
                        logger.info(f"  - {name}: {df.shape[0]} 行 x {df.shape[1]} 列")
            
        elif args.command == 'dashboard':
            logger.info("正在生成数据看板")
            system.load_data()
            dashboard_path = system.generate_dashboard()
            if dashboard_path:
                logger.info(f"数据看板已生成: {dashboard_path}")
                if hasattr(args, 'open') and args.open:
                    open_dashboard(dashboard_path)
            
        elif args.command == 'full':
            logger.info("正在运行完整分析流程")
            results = system.run_full_analysis()
            if results:
                logger.info("完整分析流程已完成")
                dashboard_path = results.get('dashboard_path')
                if dashboard_path and hasattr(args, 'open') and args.open:
                    open_dashboard(dashboard_path)
            
        else:
            # 如果没有指定命令，显示帮助信息
            parser.print_help()
            return 0
        
        print("\n" + "="*60)
        print(" "*20 + "分析任务已完成")
        print("="*60 + "\n")
        
        return 0
        
    except KeyboardInterrupt:
        logger.info("用户中断操作")
        return 130
    except Exception as e:
        logger.error(f"执行过程中出错: {e}", exc_info=True)
        return 1

if __name__ == "__main__":
    sys.exit(main())